package com.example.stmp.Controller;

import com.example.stmp.dto.AdministrativeClassDTO;
import com.example.stmp.Service.AdministrativeClass.AdministrativeClassService;
import com.example.stmp.excel.ExcelListener;
import com.alibaba.excel.EasyExcel;
import com.example.stmp.pojo.Result;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * 行政班级控制器类，用于处理与行政班级相关的HTTP请求
 */
@Slf4j
@RestController
@RequestMapping("/AdministrativeClass")
public class AdministrativeClassController {

    @Resource
    private AdministrativeClassService administrativeClassService;

    /**
     * 添加行政班级信息
     *
     * @param dto 行政班级数据传输对象
     * @return 添加结果，包含受影响的行数
     */
    @PostMapping("/add")
    public Result<Integer> add(@RequestBody AdministrativeClassDTO dto) {
        log.info("添加行政班级信息");
        int result = administrativeClassService.addAdministrativeClass(dto);
        return result > 0 ? Result.success(result) : Result.error("添加失败");
    }

    /**
     * 批量添加行政班级信息
     *
     * @param dtoList 行政班级数据传输对象列表
     * @return 添加结果，包含受影响的行数
     */
    @PostMapping("/addBatch")
    public Result<Integer> addBatch(@RequestBody List<AdministrativeClassDTO> dtoList) {
        log.info("批量添加行政班级信息");
        int result = administrativeClassService.addAdministrativeClassBatch(dtoList);
        return result > 0 ? Result.success(result) : Result.error("批量添加失败");
    }

    /**
     * 根据行政班级ID删除行政班级信息
     *
     * @param acId 行政班级ID
     * @return 删除结果，包含受影响的行数
     */
    @DeleteMapping("/delete/{acId}")
    public Result<Integer> delete(@PathVariable String acId) {
        log.info("根据行政班级ID删除行政班级信息: {}", acId);
        int result = administrativeClassService.deleteAdministrativeClassById(acId);
        return result > 0 ? Result.success(result) : Result.error("删除失败");
    }

    /**
     * 更新行政班级信息
     *
     * @param dto 行政班级数据传输对象
     * @return 更新结果，包含受影响的行数
     */
    @PutMapping("/update")
    public Result<Integer> update(@RequestBody AdministrativeClassDTO dto) {
        log.info("更新行政班级信息");
        int result = administrativeClassService.updateAdministrativeClass(dto);
        return result > 0 ? Result.success(result) : Result.error("更新失败");
    }

    /**
     * 根据行政班级ID获取行政班级信息
     *
     * @param acId 行政班级ID
     * @return 行政班级数据传输对象
     */
    @GetMapping("/get/{acId}")
    public Result<AdministrativeClassDTO> get(@PathVariable String acId) {
        log.info("根据行政班级ID获取行政班级信息");
        AdministrativeClassDTO dto = administrativeClassService.getAdministrativeClassById(acId);
        return dto != null ? Result.success(dto) : Result.error("未找到该行政班级");
    }

    /**
     * 查询行政班级信息
     *
     * @param acName    行政班级名称
     * @param counselor 班主任
     * @param majorName 专业名称
     * @return 行政班级信息列表
     */
    @GetMapping("/query")
    public Result<List<AdministrativeClassDTO>> query(@RequestParam(required = false) String acName,
                                                      @RequestParam(required = false) String counselor,
                                                      @RequestParam(required = false) String majorName) {
        log.info("开始查询");
        List<AdministrativeClassDTO> list = administrativeClassService.queryAdministrativeClass(acName, counselor, majorName);
        return Result.success(list);
    }

    /**
     * 导入Excel文件中的行政班级信息
     *
     * @param file Excel文件
     * @return 导入结果，包含受影响的行数
     * @throws IOException 如果文件读取发生错误
     */
    @PostMapping("/importExcel")
    public Result<Integer> importExcel(@RequestParam("file") MultipartFile file) throws IOException {
        log.info("开始导入Excel文件");
        ExcelListener<AdministrativeClassDTO> listener = new ExcelListener<>();
        EasyExcel.read(file.getInputStream(), AdministrativeClassDTO.class, listener).sheet().doRead();
        List<AdministrativeClassDTO> list = listener.getCachedDataList();
        int result = administrativeClassService.addAdministrativeClassBatch(list);
        return result > 0 ? Result.success(result) : Result.error("Excel导入失败");
    }
}
